package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import java.util.ArrayList;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanMensagem;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.InformationDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.SuccessDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.WindowResizeListener;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TableListener;
import com.google.gwt.user.client.ui.Widget;

public class ACaixaSaida extends DockPanel implements WindowResizeListener
{
	private FlexTable flexTable;
	private HorizontalPanel rodape;

	private Button excluirBtn;

	public ACaixaSaida()
	{
		inicializar();
	}

	private void inicializar()
	{
		flexTable = new FlexTable();
		flexTable.setCellPadding(7);
		flexTable.setCellSpacing(0);
		flexTable.setWidth("100%");
		Window.addWindowResizeListener(this);
		DeferredCommand.addCommand(new Command(){
			public void execute() {
				onWindowResized(Window.getClientWidth(), Window.getClientHeight());
			}
		});
		onWindowResized(Window.getClientWidth(), Window.getClientHeight());
	
		setarEstiloGrid();

		rodape = new HorizontalPanel();
		rodape.setSpacing(5);

		// colunas...
		flexTable.setWidget(0, 0, new HTML("&nbsp;"));
		flexTable.setWidget(0, 1, new HTML("Data de envio"));
		flexTable.setWidget(0, 2, new HTML("Assunto"));
		flexTable.setWidget(0, 3, new HTML("Mensagem"));
		
		AsyncCallback<ArrayList<BeanMensagem>> cbCaixaSaida = new AsyncCallback<ArrayList<BeanMensagem>>()
		{
			public void onSuccess(ArrayList<BeanMensagem> result)
			{
				int linha = 1;
				
				if (result.size() <= 0)
				{
					flexTable.setHTML(linha, 0, "<b>Caixa de Saída</b> vazia...");
					flexTable.getFlexCellFormatter().setColSpan(1, 0, 4);

					return;
				}

				for (BeanMensagem mensagem : result)
				{
					CheckBox checkBox = new CheckBox("");
					checkBox.setName(mensagem.getId() + "");

					flexTable.setWidget(linha, 0, checkBox);
					flexTable.setHTML(linha, 1, mensagem.getDataEnvio() + "");
					flexTable.setHTML(linha, 2, "<b>" + mensagem.getAssunto() + "</b>");
					flexTable.setHTML(linha, 3,
							mensagem.getMensagem().length() > 20 ? 
									mensagem.getMensagem().substring(0, 21) + " (...)" : mensagem.getMensagem() + "");

					flexTable.getFlexCellFormatter().setStyleName(linha, 0, "emailLido");
					flexTable.getFlexCellFormatter().setStyleName(linha, 1, "emailLido");
					flexTable.getFlexCellFormatter().setStyleName(linha, 2, "emailLido");
					flexTable.getFlexCellFormatter().setStyleName(linha, 3, "emailLido");
				}
			}

			public void onFailure(Throwable caught)
			{
				ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao receber mensagens: " + caught.getMessage());

				errorDialogBox.center();
				errorDialogBox.show();
			}
		};

		Util.getService().getMensagensCaixaSaida(cbCaixaSaida);
		
		excluirBtn = new Button("Excluir");

		rodape.add(excluirBtn);
		
		// CLICKA EM ALGUMA MENSAGEM
		flexTable.addTableListener(
			new TableListener()
			{
				public void onCellClicked(SourcesTableEvents sender, int row, int cell)
				{
					// se nao for os campos da grid
					if (row != 0 && cell != 0)
					{
						CheckBox checkbox = (CheckBox) flexTable.getWidget(row, 0);

						AMensagem viewMensagem = new AMensagem(Integer.parseInt(checkbox.getName()));
						viewMensagem.setRespondivel(false); // desabilita opcao para responder a mensagem

						viewMensagem.show();
					}
				}
			}
		);
		
		// EXCLUIR MENSAGENS
		excluirBtn.addClickListener(
			new ClickListener()
			{
				public void onClick(Widget sender)
				{
					// lista de mensagens a serem excluidas
					final ArrayList<BeanMensagem> clMensagens = new ArrayList<BeanMensagem>();

					// monta uma lista com todas os ID's de todas as mensagens
					for (int row = 1; row < flexTable.getRowCount(); row++)
					{
						CheckBox checkBox = (CheckBox) flexTable.getWidget(row, 0);
						
						if (checkBox != null && checkBox.isChecked()) // se a checkbox estiver checada
						{
							Integer idMensagem = Integer.parseInt(checkBox.getName());

							BeanMensagem mensagem = new BeanMensagem();
							mensagem.setId(idMensagem);

							clMensagens.add(mensagem);
						}
					}

					// callback para exclusao de mensagens
					AsyncCallback cbExcluirMensagens = new AsyncCallback()
					{
						public void onSuccess(Object result)
						{
							SuccessDialogBox successDialogBox = new SuccessDialogBox("Mensagens excluídas com sucesso.");

							successDialogBox.center();
							successDialogBox.show();

							for (BeanMensagem mensagem : clMensagens)
							{
								for (int row = 1; row < flexTable.getRowCount(); row++)
								{
									CheckBox checkbox = (CheckBox) flexTable.getWidget(row, 0);

									Integer idMensagem = Integer.parseInt(checkbox.getName());
									
									if (mensagem.getId() == idMensagem)
									{
										flexTable.removeRow(row);
									}
								}
							}
						};

						public void onFailure(Throwable caught)
						{
							ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao excluir mensagens: " + caught.getMessage());

							errorDialogBox.center();
							errorDialogBox.show();
						};
					};
					
					if (clMensagens.size() > 0)
					{
						Util.getService().excluirMensagensCxSaida(clMensagens, cbExcluirMensagens);
					}
					else
					{
						InformationDialogBox infoDialogBox = new InformationDialogBox("Escolha ao menos uma mensagem para exclusão.");

						infoDialogBox.center();
						infoDialogBox.show();
					}
				}
			}
		);

		this.add(flexTable, DockPanel.CENTER);
		this.add(rodape, DockPanel.SOUTH);
	}

	private void setarEstiloGrid()
	{
		flexTable.getFlexCellFormatter().setStyleName(0, 0, "gridCampos");
		flexTable.getFlexCellFormatter().setStyleName(0, 1, "gridCampos");
		flexTable.getFlexCellFormatter().setStyleName(0, 2, "gridCampos");
		flexTable.getFlexCellFormatter().setStyleName(0, 3, "gridCampos");

		flexTable.setStyleName("grid");
	}

	public void onWindowResized(int width, int height) {
		int largura = width - this.getAbsoluteLeft() - 9;
		if(largura < 1){
			largura = 1;
		}
		
		int altura = height - this.getAbsoluteTop() - 9;
		if(altura < 1){
			altura = 1;
		} else {
			altura = flexTable.getOffsetHeight();
		}
		this.setPixelSize(largura, altura);
	}
}